home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / abreed3.lha / ObjectMove < prev    next >
Text File  |  1995-09-13  |  29KB  |  2,136 lines

  1. extlen: dc.w 0
  2. awayfromwall: dc.w 0
  3. wallbounce: dc.w 0
  4. wallxsize: dc.w 0
  5. wallzsize: dc.w 0
  6. walllength: dc.w 0
  7.  
  8. RoomPath: ds.w 100
  9. RoomPathPtr: dc.l 0
  10.  
  11. MoveObject:
  12.  
  13.  move.l #RoomPath,RoomPathPtr
  14.  
  15.  clr.b hitwall
  16.  
  17.  move.w newx,d0
  18.  sub.w oldx,d0
  19.  move.w d0,xdiff
  20.  move.w newz,d0
  21.  sub.w oldz,d0
  22.  move.w d0,zdiff
  23.  tst.w xdiff
  24.  bne.s .moveing
  25.  tst.w zdiff
  26.  bne.s .moveing
  27.  rts
  28.  
  29. .moveing:
  30.  
  31.  move.l newy,wallhitheight
  32.  move.l objroom,a0
  33.  
  34. gobackanddoitallagain:
  35.  
  36.  move.l a0,a5
  37.  adda.w ToExitList(a5),a0
  38.  move.l a0,test
  39.  move.l FloorLines,a1
  40. checkwalls:
  41.  move.w (a0)+,d0
  42.  blt nomorewalls
  43.  
  44.  asl.w #4,d0
  45.  lea (a1,d0.w),a2
  46.  
  47. *********************************
  48. * Check if we are within exit limits
  49. * of zone.
  50. *********************************
  51.  
  52.  move.l #-65536*256,d0
  53.  move.l d0,LowerRoofHeight
  54.  move.l d0,UpperRoofHeight
  55.  move.l d0,LowerFloorHeight
  56.  move.l d0,UpperFloorHeight
  57.  
  58. ; tst.b 9(a2)
  59. ; bne thisisawall2
  60.  
  61.  moveq #0,d1
  62.  move.w 8(a2),d1
  63.  blt thisisawall2
  64.  move.l ZoneAdds,a4
  65.  move.l (a4,d1.w*4),a4
  66.  add.l LEVELDATA,a4
  67.  
  68.  move.l ToZoneFloor(a4),d1
  69.  move.l d1,LowerFloorHeight
  70.  move.l ToZoneRoof(a4),d2
  71.  move.l d2,LowerRoofHeight
  72.  
  73.  bra thisisawall1
  74.  
  75.  sub.l d2,d1
  76.  cmp.l thingheight,d1
  77.  ble thisisawall1
  78.  
  79.  move.l oldy,d0
  80.  move.l d0,d1
  81.  add.l thingheight,d1
  82.  sub.l ToZoneFloor(a4),d1
  83.  bgt.s chkstepup
  84.  
  85.  neg.l d1
  86.  cmp.l StepDownVal,d1
  87.  blt.s botinsidebot
  88.  
  89. chkstepup:
  90.  cmp.l StepUpVal,d1
  91.  blt.s botinsidebot
  92.  
  93. ; We have a wall!
  94.  bra thisisawall1
  95.  
  96. botinsidebot:
  97.  
  98.  sub.l ToZoneRoof(a4),d0
  99.  blt.s thisisawall1
  100.  
  101.  bra checkwalls
  102.  
  103. thisisawall1:
  104.  
  105.  move.l ToUpperFloor(a4),d1
  106.  move.l d1,UpperFloorHeight
  107.  move.l ToUpperRoof(a4),d2
  108.  sub.l d2,d1
  109.  move.l d2,UpperRoofHeight
  110.  
  111.  bra thisisawall2
  112.  
  113.  cmp.l thingheight,d1
  114.  ble thisisawall2
  115.  
  116.  move.l oldy,d0
  117.  move.l d0,d1
  118.  add.l thingheight,d1
  119.  sub.l ToUpperFloor(a4),d1
  120.  bgt.s chkstepup2
  121.  
  122.  neg.l d1
  123.  cmp.l StepDownVal,d1
  124.  blt.s botinsidebot2
  125.  bra.s thisisawall2
  126.  
  127. chkstepup2:
  128.  cmp.l StepUpVal,d1
  129.  blt.s botinsidebot2
  130.  
  131. ; We have a wall!
  132.  bra thisisawall2
  133.  
  134. botinsidebot2:
  135.  
  136.  sub.l ToUpperRoof(a4),d0
  137.  blt.s thisisawall2
  138.  
  139.  bra checkwalls
  140. thisisawall2
  141.  
  142.  move.l #0,a4
  143.  move.l #0,a6
  144.  move.b awayfromwall,d3
  145.  blt.s .notomatoes
  146.  
  147.  move.b 12(a2),d2
  148.  ext.w d2
  149.  
  150.  move.b 13(a2),d4
  151.  ext.w d4
  152.  
  153.  tst.b d3
  154.  beq.s .noshift
  155.  asl.w d3,d2
  156.  asl.w d3,d4
  157. .noshift
  158.  
  159.  move.w d2,a4
  160.  move.w d4,a6
  161.  
  162. .notomatoes:
  163.  
  164.  move.w newx,d0
  165.  move.w newz,d1
  166.  sub.w (a2),d0
  167.  sub.w 2(a2),d1
  168.  sub.w a4,d0
  169.  sub.w a6,d1
  170.  
  171.  move.w 4(a2),d2
  172.  sub.w a4,d2
  173.  sub.w a6,d2
  174.  
  175.  muls d2,d1
  176.  
  177.  move.w 6(a2),d5
  178.  add.w a4,d5
  179.  sub.w a6,d5
  180.  
  181.  muls d5,d0
  182.  sub.l d1,d0
  183.  ble chkhttt
  184.  
  185.  move.w 10(a2),d3
  186.  add.w extlen,d3
  187.  divs d3,d0
  188.  cmp.w #32,d0
  189.  bge oknothitwall
  190.  
  191.  move.w wallflags(pc),d0
  192.  or.w d0,14(a2) 
  193.  
  194.  bra oknothitwall
  195.  
  196. chkhttt:
  197.  
  198.  move.w d2,WALLXLEN
  199.  move.w d5,WALLZLEN
  200.  
  201.  move.l d0,d7
  202.  
  203.  move.w 10(a2),d3
  204.  add.w extlen,d3
  205.  divs d3,d7    ;  d
  206.  
  207.  move.l newy,d4
  208.  sub.l oldy,d4
  209. ; beq .dontworryhit
  210.  
  211.  move.w oldx,d0
  212.  move.w oldz,d1
  213.  sub.w (a2),d0
  214.  sub.w 2(a2),d1
  215.  sub.w a4,d0
  216.  sub.w a6,d1
  217.  
  218.  muls d2,d1
  219.  muls d5,d0
  220.  sub.l d1,d0
  221.  divs d3,d0    ; otherd
  222.  
  223.  sub.w d7,d0    ; total distance travelled across wall
  224.  bgt.s .ohbugger
  225.  moveq #1,d0
  226. .ohbugger:
  227.  
  228. ; We now have ratio to multiply x,z and y differences
  229. ; by. Check y=0 since that's quite common.
  230.  
  231.  move.l d4,d1
  232.  beq.s .dontworryhit
  233.  
  234.  divs d0,d1
  235.  muls d7,d1
  236. .dontworryhit:
  237.  add.l newy,d1 ; height at point of crossing wall.
  238.  move.l d1,d6
  239.  add.l thingheight,d6
  240.  sub.l StepUpVal,d6
  241.  
  242.  cmp.l LowerFloorHeight,d6
  243.  bge.s .yeshit
  244.  cmp.l LowerRoofHeight,d1
  245.  bgt oknothitwall
  246.  cmp.l UpperRoofHeight,d1
  247.  blt.s .yeshit
  248.  cmp.l UpperFloorHeight,d6
  249.  blt oknothitwall
  250.  
  251. .yeshit:
  252.  
  253.  move.l d1,wallhitheight
  254.  
  255.  tst.b wallbounce
  256.  bne.s .calcbounce
  257.  
  258.  tst.b exitfirst(pc)
  259.  beq.s .calcalong
  260.  bne.s .calcwherehit
  261.  
  262. .calcbounce:
  263.  
  264. ; For simplicity (possibility!) the
  265. ; bounce routine will:
  266. ; Place the object at wall contact
  267. ; point
  268. ; Supply wall data to reflect the
  269. ; movement direction of the object
  270.  
  271.  move.w d2,wallxsize
  272.  move.w d5,wallzsize
  273.  move.w d3,walllength
  274.  
  275. .calcwherehit:
  276.  
  277. ; add.w #20,d7
  278.  move.w newx,d6
  279.  sub.w oldx,d6
  280.  muls d7,d6
  281.  divs d0,d6
  282.  add.w newx,d6
  283.  
  284.  move.w newz,d1
  285.  sub.w oldz,d1
  286.  muls d7,d1
  287.  divs d0,d1
  288.  add.w newz,d1
  289.  move.w d6,d0
  290.  move.w d1,d7
  291.  bra.s .calcedhit
  292.  
  293. .calcalong:
  294.  
  295. ; sub.w #3,d7
  296.  move.w d7,d6
  297.  muls d5,d6
  298.  muls d2,d7
  299.  divs d3,d6
  300.  divs d3,d7
  301.  neg.w d6
  302.  add.w newx,d6    ; point on wall
  303.  add.w newz,d7
  304.  
  305.  move.w d6,d0
  306.  move.w d7,d1
  307.  bra.s othercheck
  308.  
  309. .calcedhit:
  310.  
  311.  move.w newx,d6
  312.  move.w newz,d7
  313.  sub.w oldx,d6
  314.  sub.w oldz,d7
  315.   
  316.  move.w (a2),d4
  317.  add.w a4,d4
  318.  sub.w oldx,d4
  319.  muls d4,d7; negative if on left
  320.  move.w 2(a2),d4
  321.  add.w a6,d4
  322.  sub.w oldz,d4
  323.  muls d4,d6
  324.  sub.l d6,d7
  325.  bgt oknothitwall
  326.  
  327.  move.w d0,d6
  328.  move.w d1,d7
  329.  move.w newx,d6
  330.  move.w newz,d7
  331.  sub.w oldx,d6
  332.  sub.w oldz,d7
  333.  
  334.  move.w (a2),d4
  335.  add.w a4,d4
  336.  add.w d2,d4
  337.  sub.w oldx,d4
  338.  muls d4,d7; negative if on left
  339.  move.w 2(a2),d4
  340.  add.w a6,d4
  341.  add.w d5,d4
  342.  sub.w oldz,d4
  343.  muls d4,d6
  344.  sub.l d6,d7
  345.  blt oknothitwall
  346.  bra hitthewall
  347.  
  348.  
  349. othercheck:
  350.  
  351. ; sub.w (a2),d6
  352. ; sub.w 2(a2),d7
  353. ; sub.w a4,d6
  354. ; sub.w a6,d7
  355. ; muls d6,d6
  356. ; muls d7,d7
  357. ; add.w #5,d3
  358. ; muls d3,d3
  359. ; add.l d6,d7
  360. ; cmp.l d3,d7
  361. ; bgt oknothitwall
  362. ; move.w d1,d7
  363. ; move.w d0,d6
  364. ; sub.w (a2),d6
  365. ; sub.w 2(a2),d7
  366. ; sub.w d2,d6
  367. ; sub.w d5,d7
  368. ; muls d6,d6
  369. ; muls d7,d7
  370. ; add.l d6,d7
  371. ; cmp.l d3,d7
  372. ; bgt oknothitwall
  373. ;************8 
  374.  
  375.  sub.w (a2),d6
  376.  sub.w 2(a2),d7
  377.  
  378.  sub.w a4,d6
  379.  sub.w a6,d7
  380.  move.w d2,d4
  381.  bge.s okplus1
  382.  neg.w d4
  383. okplus1
  384.  move.w d5,d3
  385.  bge.s okplus2
  386.  neg.w d3
  387. okplus2:
  388.  cmp.w d4,d3
  389.  bgt.s UseZ
  390.  
  391. ; Use the x coord!
  392.  
  393.  tst.w d6
  394.  bgt.s xispos
  395.  
  396.  move.w d2,d7
  397.  cmp.w #4,d7
  398.  bgt.s oknothitwall
  399.  sub.w #4,d7
  400.  cmp.w d7,d6
  401.  blt.s oknothitwall
  402.  
  403.  bra.s hitthewall
  404.  
  405. xispos:
  406.  
  407.  move.w d2,d7
  408.  cmp.w #-4,d7
  409.  blt.s oknothitwall
  410.  add.w #4,d7
  411.  cmp.w d7,d6
  412.  bgt.s oknothitwall
  413.  
  414.  bra.s hitthewall
  415.  
  416. UseZ:
  417.  tst.w d7
  418.  bgt.s zispos
  419.  
  420.  move.w d5,d6
  421.  cmp.w #4,d6
  422.  bgt.s oknothitwall
  423.  sub.w #4,d6
  424.  cmp.w d6,d7
  425.  blt.s oknothitwall
  426.  
  427.  bra.s hitthewall
  428.  
  429. zispos:
  430.  
  431.  move.w d5,d6
  432.  cmp.w #-4,d6
  433.  blt.s oknothitwall
  434.  add.w #4,d6
  435.  cmp.w d6,d7
  436.  bgt.s oknothitwall 
  437.  
  438. hitthewall:
  439.  
  440.  move.w d0,newx
  441.  move.w d1,newz
  442.  move.w wallflags(pc),d0
  443.  or.w d0,14(a2)
  444.  st hitwall
  445.  tst.b exitfirst(pc)
  446.  bne stopandleave
  447.  
  448. oknothitwall:
  449.  
  450.  bra checkwalls
  451. nomorewalls:
  452.  
  453.  tst.w extlen
  454.  beq NOOTHERWALLSNEEDED
  455.  
  456.  tst.w xdiff
  457.  bne.s notstill
  458.  tst.w zdiff
  459.  bne.s notstill
  460.  move.l objroom,a0
  461.  bra mustbeinsameroom
  462. notstill:
  463.  
  464.  move.l a5,a0
  465.  add.w ToExitList(a0),a0
  466.  
  467. checkotherwalls:
  468.  move.w (a0)+,d0
  469.  bge anotherwalls
  470.  cmp.w #-2,d0
  471.  beq nomoreotherwalls
  472.  bra checkotherwalls
  473.  
  474. anotherwalls:
  475.  
  476.  asl.w #4,d0
  477.  lea (a1,d0.w),a2
  478.  
  479. *********************************
  480. * Check if we are within exit limits
  481. * of zone.
  482. *********************************
  483.  
  484. ; tst.b 9(a2)
  485. ; bne .thisisawall2
  486.  
  487.  moveq #0,d1
  488.  move.w 8(a2),d1
  489.  blt .thisisawall2
  490.  move.l ZoneAdds,a4
  491.  move.l (a4,d1.w*4),a4
  492.  add.l LEVELDATA,a4
  493.  
  494.  move.l ToZoneFloor(a4),d1
  495.  sub.l ToZoneRoof(a4),d1
  496.  cmp.l thingheight,d1
  497.  ble .thisisawall1
  498.  
  499.  move.l newy,d0
  500.  move.l d0,d1
  501.  add.l thingheight,d1
  502.  sub.l ToZoneFloor(a4),d1
  503.  bgt.s .chkstepup
  504.  
  505.  neg.l d1
  506.  cmp.l StepDownVal,d1
  507.  blt.s .botinsidebot
  508.  bra.s .thisisawall1
  509.  
  510. .chkstepup:
  511.  
  512.  cmp.l StepUpVal,d1
  513.  blt.s .botinsidebot
  514.  
  515. ; We have a wall!
  516.  bra .thisisawall1
  517.  
  518. .botinsidebot:
  519.  
  520.  sub.l ToZoneRoof(a4),d0
  521.  blt.s .thisisawall1
  522.  
  523.  bra checkotherwalls
  524.  
  525. .thisisawall1:
  526.  
  527.  move.l ToUpperFloor(a4),d1
  528.  sub.l ToUpperRoof(a4),d1
  529.  cmp.l thingheight,d1
  530.  ble .thisisawall2
  531.  
  532.  move.l newy,d0
  533.  move.l d0,d1
  534.  add.l thingheight,d1
  535.  sub.l ToUpperFloor(a4),d1
  536.  bgt.s .chkstepup2
  537.  
  538.  neg.l d1
  539.  cmp.l StepDownVal,d1
  540.  blt.s .botinsidebot2
  541.  bra.s .thisisawall2
  542.  
  543. .chkstepup2:
  544.  
  545.  cmp.l StepUpVal,d1
  546.  blt.s .botinsidebot2
  547.  
  548. ; We have a wall!
  549.  bra .thisisawall2
  550.  
  551. .botinsidebot2:
  552.  
  553.  sub.l ToUpperRoof(a4),d0
  554.  blt.s .thisisawall2
  555.  
  556.  bra checkotherwalls
  557.  
  558. .thisisawall2:
  559.  
  560.  move.l #0,a4
  561.  move.l #0,a6
  562.  move.b awayfromwall,d3
  563.  blt.s .notomatoes
  564.  
  565.  move.b 12(a2),d2
  566.  ext.w d2
  567.  
  568.  move.b 13(a2),d4
  569.  ext.w d4
  570.  
  571.  tst.b d3
  572.  beq.s .noshift
  573.  asl.w d3,d2
  574.  asl.w d3,d4
  575. .noshift
  576.  
  577.  move.w d2,a4
  578.  move.w d4,a6
  579.  
  580. .notomatoes:
  581.  
  582.  move.w 4(a2),d2
  583.  sub.w a4,d2
  584.  sub.w a6,d2
  585.  move.w d2,DX
  586.  move.w 6(a2),d5
  587.  add.w a4,d5
  588.  sub.w a6,d5
  589.  
  590.  
  591.  move.w newx,d0
  592.  move.w newz,d1
  593.  sub.w (a2),d0
  594.  sub.w 2(a2),d1
  595.  sub.w a4,d0
  596.  sub.w a6,d1
  597.  muls DX,d1
  598.  muls d5,d0
  599.  sub.l d1,d0
  600.  bge .oknothitwall
  601.  move.l d0,d7
  602.  
  603.  move.w oldx,d1
  604.  move.w newx,d3
  605.  sub.w d1,d3
  606.  sub.w (a2),d1
  607.  sub.w a4,d1 ;e-a=d1
  608.  
  609.  move.w 2(a2),d2
  610.  add.w a6,d2
  611.  sub.w oldz,d2    ;b-f=d2
  612.  
  613.  move.w newz,d4
  614.  sub.w oldz,d4
  615.  
  616.  muls d4,d1
  617.  muls d3,d2
  618.  add.l d2,d1    ; h(e-a)+g(b-f)
  619.  
  620.  muls DX,d4
  621.  muls d5,d3
  622.  sub.l d3,d4
  623.  beq .oknothitwall
  624.  bgt.s .botpos
  625. .botneg:
  626.  tst.l d1
  627.  bgt .oknothitwall
  628.  cmp.l d1,d4
  629.  ble .mighthit
  630.  bra .oknothitwall
  631.  
  632. .botpos:
  633.  tst.l d1
  634.  blt .oknothitwall
  635.  cmp.l d1,d4
  636.  blt .oknothitwall
  637.  
  638. .mighthit:
  639.  
  640.  move.w 10(a2),d0
  641.  add.w extlen,d0
  642.  divs d0,d7    ;  d
  643.  sub.w #3,d7
  644.  move.w d7,d6
  645.  muls d5,d6
  646.  muls DX,d7
  647.  divs d0,d6
  648.  divs d0,d7
  649.  neg.w d6
  650.  add.w newx,d6    ; point on wall
  651.  add.w newz,d7
  652.  
  653.  move.w oldx,d0
  654.  move.w oldz,d1
  655.  sub.w (a2),d0
  656.  sub.w 2(a2),d1
  657.  sub.w a4,d0
  658.  sub.w a6,d1
  659.  muls DX,d1
  660.  muls d5,d0
  661.  sub.l d1,d0
  662.  blt .oknothitwall
  663.  
  664.  move.w d6,d0
  665.  move.w d7,d1
  666.  
  667.  bra .hitthewall
  668.  
  669.  sub.w (a2),d6
  670.  sub.w 2(a2),d7
  671.  move.w d6,d4
  672.  bge.s .okplus1
  673.  neg.w d4
  674. .okplus1
  675.  move.w d7,d3
  676.  bge.s .okplus2
  677.  neg.w d3
  678. .okplus2:
  679.  cmp.w d4,d3
  680.  bgt.s .UseZ
  681.  
  682. ; Use the x coord!
  683.  
  684.  tst.w d6
  685.  bgt.s .xispos
  686.  
  687.  move.w DX,d7
  688.  bgt.s .oknothitwall
  689.  cmp.w d7,d6
  690.  blt.s .oknothitwall
  691.  
  692.  bra.s .hitthewall
  693.  
  694. .xispos:
  695.  
  696.  move.w DX,d7
  697.  blt.s .oknothitwall
  698.  cmp.w d7,d6
  699.  bgt.s .oknothitwall
  700.  
  701.  bra.s .hitthewall
  702.  
  703. .UseZ:
  704.  tst.w d7
  705.  bgt.s .zispos
  706.  
  707.  move.w d5,d6
  708.  bgt.s .oknothitwall
  709.  cmp.w d6,d7
  710.  blt.s .oknothitwall
  711.  
  712.  bra.s .hitthewall
  713.  
  714. .zispos:
  715.  
  716.  move.w d5,d6
  717.  blt.s .oknothitwall
  718.  cmp.w d6,d7
  719.  bgt.s .oknothitwall
  720.  
  721.  
  722. .hitthewall:
  723.  
  724.  move.w d0,newx
  725.  move.w d1,newz
  726.  move.w wallflags(pc),d0
  727.  or.w d0,14(a2)
  728.  st hitwall
  729.  tst.b exitfirst(pc)
  730.  bne stopandleave
  731.  
  732. .oknothitwall:
  733.  
  734.  bra checkotherwalls
  735. nomoreotherwalls:
  736.  
  737. NOOTHERWALLSNEEDED
  738.  
  739.  
  740. ; move.w xdiff,d2
  741. ; muls d2,d2
  742. ; move.w zdiff,d3
  743. ; muls d3,d3
  744. ; move.w #0,movespd
  745. ; move.l #0,largespd
  746. ; add.l d3,d2
  747. ;
  748. ; move.w #31,d0
  749. ;.findhigh
  750. ; btst d0,d2
  751. ; bne .foundhigh
  752. ; dbra d0,.findhigh
  753. ;.foundhigh
  754. ; asr.w #1,d0
  755. ; clr.l d3
  756. ; bset d0,d3
  757. ; move.l d3,d0
  758. ;
  759. ; move.w d0,d3
  760. ; muls d3,d3    ; x*x
  761. ; sub.l d2,d3    ; x*x-a
  762. ; asr.l #1,d3    ; (x*x-a)/2
  763. ; divs d0,d3    ; (x*x-a)/2x
  764. ; sub.w d3,d0    ; second approx
  765. ; bgt .stillnot0
  766. ; move.w #1,d0
  767. ;.stillnot0
  768. ;
  769. ; move.w d0,d3
  770. ; muls d3,d3
  771. ; sub.l d2,d3
  772. ; asr.l #1,d3
  773. ; divs d0,d3
  774. ; sub.w d3,d0    ; second approx
  775. ; bgt .stillnot02
  776. ; move.w #1,d0
  777. ;.stillnot02
  778. ;
  779. ; move.w d0,movespd
  780. ;.moving
  781. ; ext.l d0
  782. ; asl.l #5,d0
  783. ; move.l d0,largespd
  784.  
  785. *****************************************************
  786. * FIND ROOM WE'RE STANDING IN ***********************
  787. *****************************************************
  788.  
  789.  move.l a5,a0
  790.  adda.w ToExitList(a5),a0
  791.  
  792.  move.l FloorLines,a1
  793. CheckMoreFloorLines
  794.  move.w (a0)+,d0    ; Either a floor line or -1
  795.  blt NoMoreFloorLines
  796.  asl.w #4,d0
  797.  lea (a1,d0.w),a2
  798.  
  799.  tst.w 8(a2)
  800.  blt.s CheckMoreFloorLines
  801.  
  802.  clr.b CrossIntoTop
  803.  
  804.  moveq #0,d1
  805.  move.w 8(a2),d1
  806.  move.l ZoneAdds,a4
  807.  move.l (a4,d1.w*4),a4
  808.  add.l LEVELDATA,a4
  809.  
  810.  move.l ToZoneRoof(a4),LowerRoofHeight
  811.  
  812. ; move.l newy,d0
  813. ; move.l d0,d1
  814. ; add.l thingheight,d1
  815. ;
  816. ; sub.l ToZoneRoof(a4),d0
  817. ; blt.s NOTINLOWER
  818. ; sub.l ToZoneFloor(a4),d1
  819. ; blt.s okthebottom
  820. ;
  821. ; cmp.l StepUpVal,d1
  822. ; bgt.s NOTINLOWER
  823. ;
  824. ; move.l ToZoneFloor(a4),d1
  825. ; sub.l thingheight,d1
  826. ; move.l d1,newy
  827. ; bra okthebottom
  828. ;
  829. ;NOTINLOWER:
  830. ;
  831. ; move.l ToZoneRoof(a4),billy
  832. ; move.l ToZoneRoof(a4),billy+4
  833. ; add.l d0,billy+4
  834. ;
  835. ; st CrossIntoTop
  836. ; move.l newy,d0
  837. ; move.l d0,d1
  838. ; add.l thingheight,d1
  839. ; sub.l ToUpperRoof(a4),d0
  840. ; blt CheckMoreFloorLines
  841. ; sub.l ToUpperFloor(a4),d1
  842. ; blt.s okthebottom
  843. ;
  844. ; cmp.l StepUpVal,d1
  845. ; bgt CheckMoreFloorLines
  846.  
  847. ; move.l ToUpperFloor(a4),d1
  848. ; sub.l thingheight,d1
  849. ; move.l d1,newy
  850.  
  851. okthebottom
  852.  
  853.  move.w newx,d0
  854.  move.w newz,d1
  855.  sub.w (a2),d0    ;a
  856.  sub.w 2(a2),d1    ;b
  857.  muls 4(a2),d1
  858.  muls 6(a2),d0
  859.  moveq #0,d3
  860.  move.w 8(a2),d3
  861.  move.l ZoneAdds,a3
  862.  move.l (a3,d3.w*4),a3
  863.  add.l LEVELDATA,a3
  864.  sub.l d1,d0
  865.  bge StillSameSide
  866.  
  867. * Player is now on the left side of this line.
  868. * Where was he before?
  869.  
  870. ; cmp.l a4,a5
  871. ; bne StillSameSide
  872.  
  873. ; move.w oldx,d0
  874. ; move.w oldz,d1
  875. ; sub.w (a2),d0    ;a
  876. ; sub.w 2(a2),d1    ;b
  877. ; muls 4(a2),d1
  878. ; muls 6(a2),d0
  879. ; sub.l d1,d0
  880. ; blt StillSameSide
  881. ; bra checkifcrossed
  882.  
  883. OnRightsideofline:
  884. * Player is now on the right side of the line.
  885. * Where was he last time?
  886.  
  887. ; exg a3,a4
  888.  
  889. ; cmp.l a3,a5
  890. ; bne StillSameSide
  891.  
  892. ; move.w oldx,d0
  893. ; move.w oldz,d1
  894. ; sub.w (a2),d0    ;a
  895. ; sub.w 2(a2),d1    ;b
  896. ; muls 4(a2),d1
  897. ; muls 6(a2),d0
  898. ; sub.l d1,d0
  899. ; bgt StillSameSide
  900.  
  901. checkifcrossed:
  902.  
  903. *Player used to be on other side of this line.
  904. *Need to check if he crossed it.
  905.  
  906.  move.l d0,billy
  907.  
  908.  move.w newx,d6
  909.  move.w newz,d7
  910.  sub.w oldx,d6
  911.  sub.w oldz,d7
  912.   
  913.  move.w (a2),d4
  914.  sub.w oldx,d4
  915.  muls d4,d7; negative if on left
  916.  move.w 2(a2),d4
  917.  sub.w oldz,d4
  918.  muls d4,d6
  919.  sub.l d6,d7
  920.  bgt StillSameSide
  921.  
  922.  move.w d0,d6
  923.  move.w d1,d7
  924.  move.w newx,d6
  925.  move.w newz,d7
  926.  sub.w oldx,d6
  927.  sub.w oldz,d7
  928.  
  929.  move.w (a2),d4
  930.  add.w 4(a2),d4
  931.  sub.w oldx,d4
  932.  muls d4,d7; negative if on left
  933.  move.w 2(a2),d4
  934.  add.w 6(a2),d4
  935.  sub.w oldz,d4
  936.  muls d4,d6
  937.  sub.l d6,d7
  938.  blt StillSameSide
  939.  
  940. ; Find height at crossing point:
  941.  
  942.  move.l billy,d7
  943.  divs 10(a2),d7
  944.  move.w oldx,d0
  945.  move.w oldz,d1
  946.  sub.w (a2),d0
  947.  sub.w 2(a2),d1
  948.  sub.w a4,d0
  949.  sub.w a6,d1
  950.  
  951.  muls 4(a2),d1
  952.  muls 6(a2),d0
  953.  sub.l d1,d0
  954.  divs 10(a2),d0 
  955.  
  956.  sub.w d7,d0
  957.  bgt.s .ohbugger
  958.  moveq #1,d0
  959. .ohbugger:
  960.  
  961.  
  962.  move.l newy,d4
  963.  sub.l oldy,d4
  964.  divs d0,d4
  965.  muls d7,d4
  966.  add.l newy,d4
  967.  
  968.  cmp.l LowerRoofHeight,d4
  969.  slt StoodInTop
  970.  
  971.  move.l a3,a5
  972.  move.l RoomPathPtr,a0
  973.  move.w (a3),(a0)+
  974.  move.l a0,RoomPathPtr
  975.  move.l a3,a0
  976.  move.l a5,objroom
  977.  
  978.  bra gobackanddoitallagain
  979. ; bra.s donefloorline
  980.  
  981. StillSameSide:
  982. donefloorline:
  983.  
  984.  bra CheckMoreFloorLines
  985. NoMoreFloorLines:
  986.  
  987.  move.l a5,a0
  988.  move.l a5,objroom
  989.  
  990. mustbeinsameroom:
  991.  
  992. stopandleave:
  993.  
  994.  move.l RoomPathPtr,a0
  995.  move.w #-1,(a0)+
  996.  
  997.  rts
  998.  
  999.  
  1000. DX: dc.w 0
  1001.  
  1002. tstxval: dc.l 0
  1003. oldx: dc.l 0
  1004. oldz: dc.l 0
  1005. newx: dc.l 0
  1006. newz: dc.l 0
  1007. xdiff: dc.l 0
  1008. zdiff: dc.l 0
  1009. objroom: dc.l 0
  1010. hitwall: dc.b 0
  1011. exitfirst: dc.b 0
  1012. speed: dc.w 0
  1013. wallflags: dc.w 0
  1014. distaway: dc.w 0
  1015. newy: dc.l 0
  1016. oldy: dc.l 0
  1017. thingheight: dc.l 0
  1018. StepUpVal: dc.l 0
  1019. StepDownVal: dc.l 0
  1020. wallhitheight: dc.l 0
  1021. seclot: dc.b 0
  1022.  
  1023.  even
  1024. WALLXLEN: dc.w 0
  1025. WALLZLEN: dc.w 0
  1026. onwallx: dc.w 0
  1027. onwallz: dc.w 0
  1028. slidex: dc.w 0
  1029. slidez: dc.w 0
  1030. CrossIntoTop: dc.b 0
  1031. StoodInTop: dc.b 0
  1032. LowerFloorHeight: dc.l 0
  1033. LowerRoofHeight: dc.l 0
  1034. UpperFloorHeight: dc.l 0
  1035. UpperRoofHeight: dc.l 0
  1036.  
  1037. billy: dc.l 0,0
  1038.  
  1039.  even
  1040.  
  1041. HeadTowards:
  1042.  
  1043.  move.w newx,d1
  1044.  sub.w oldx,d1
  1045.  move.w d1,xdiff
  1046.  move.w newz,d2
  1047.  sub.w oldz,d2
  1048.  move.w d2,zdiff
  1049.  muls d1,d1
  1050.  muls d2,d2
  1051.  move.w #0,d0
  1052.  move.w d0,distaway
  1053.  add.l d1,d2
  1054.  beq nochange
  1055.  
  1056.  move.w #31,d0
  1057. .findhigh
  1058.  btst d0,d2
  1059.  bne .foundhigh
  1060.  dbra d0,.findhigh
  1061. .foundhigh
  1062.  asr.w #1,d0
  1063.  clr.l d3
  1064.  bset d0,d3
  1065.  move.l d3,d0
  1066.  
  1067.  move.w d0,d1
  1068.  muls d1,d1    ; x*x
  1069.  sub.l d2,d1    ; x*x-a
  1070.  asr.l #1,d1    ; (x*x-a)/2
  1071.  divs d0,d1    ; (x*x-a)/2x
  1072.  sub.w d1,d0    ; second approx
  1073.  bgt .stillnot0
  1074.  move.w #1,d0
  1075. .stillnot0
  1076.  
  1077.  move.w d0,d1
  1078.  muls d1,d1
  1079.  sub.l d2,d1
  1080.  asr.l #1,d1
  1081.  divs d0,d1
  1082.  sub.w d1,d0    ; second approx
  1083.  bgt .stillnot02
  1084.  move.w #1,d0
  1085. .stillnot02
  1086.  
  1087.  move.w d0,distaway
  1088.  
  1089. ; d0=perpdist
  1090.  
  1091.  cmp.w Range,d0
  1092.  sle GotThere
  1093.  bgt.s faraway
  1094.  
  1095.  move.w xdiff,d1
  1096.  move.w zdiff,d2
  1097.  muls Range,d1
  1098.  muls Range,d2
  1099.  divs d0,d1
  1100.  divs d0,d2
  1101.  neg.w d1
  1102.  neg.w d2
  1103.  add.w d1,newx
  1104.  add.w d2,newz
  1105.  bra nochange
  1106.  
  1107. faraway:
  1108.  move.w speed,d3
  1109.  add.w Range,d3
  1110.  cmp.w d0,d3
  1111.  blt.s .notoofast
  1112.  move.w d0,d3
  1113.  st GotThere
  1114. .notoofast:
  1115.  sub.w Range,d3
  1116.  
  1117.  move.w xdiff,d1
  1118.  muls d3,d1
  1119.  divs d0,d1
  1120.  move.w zdiff,d2
  1121.  muls d3,d2
  1122.  divs d0,d2
  1123.  add.w oldx,d1
  1124.  move.w d1,newx
  1125.  add.w oldz,d2
  1126.  move.w d2,newz
  1127.  
  1128. nochange:
  1129.  
  1130.  rts
  1131.  
  1132.  
  1133. CalcDist:
  1134.  
  1135.  move.w newx,d1
  1136.  sub.w oldx,d1
  1137.  move.w d1,xdiff
  1138.  move.w newz,d2
  1139.  sub.w oldz,d2
  1140.  move.w d2,zdiff
  1141.  muls d1,d1
  1142.  muls d2,d2
  1143.  move.w #0,d0
  1144.  move.w d0,distaway
  1145.  add.l d1,d2
  1146.  beq .nochange
  1147.  
  1148.  move.w #31,d0
  1149. .findhigh
  1150.  btst d0,d2
  1151.  bne .foundhigh
  1152.  dbra d0,.findhigh
  1153. .foundhigh
  1154.  asr.w #1,d0
  1155.  clr.l d3
  1156.  bset d0,d3
  1157.  move.l d3,d0
  1158.  
  1159.  move.w d0,d1
  1160.  muls d1,d1    ; x*x
  1161.  sub.l d2,d1    ; x*x-a
  1162.  asr.l #1,d1    ; (x*x-a)/2
  1163.  divs d0,d1    ; (x*x-a)/2x
  1164.  sub.w d1,d0    ; second approx
  1165.  bgt .stillnot0
  1166.  move.w #1,d0
  1167. .stillnot0
  1168.  
  1169.  move.w d0,d1
  1170.  muls d1,d1
  1171.  sub.l d2,d1
  1172.  asr.l #1,d1
  1173.  divs d0,d1
  1174.  sub.w d1,d0    ; second approx
  1175.  bgt .stillnot02
  1176.  move.w #1,d0
  1177. .stillnot02
  1178.  
  1179.  move.w d0,distaway
  1180. .nochange:
  1181.  
  1182.  rts
  1183.  
  1184.  
  1185. counterer: dc.w 0
  1186. CosRet: dc.w 0
  1187. SinRet: dc.w 0
  1188.  
  1189. HeadTowardsAng:
  1190.  
  1191.  move.w newx,d1
  1192.  sub.w oldx,d1
  1193.  move.w d1,xdiff
  1194.  move.w newz,d2
  1195.  sub.w oldz,d2
  1196.  move.w d2,zdiff
  1197.  muls d1,d1
  1198.  muls d2,d2
  1199.  move.w #0,d0
  1200.  add.l d1,d2
  1201.  seq GotThere
  1202.  beq .nochange
  1203.  
  1204.  move.w #31,d0
  1205. .findhigh
  1206.  btst d0,d2
  1207.  bne .foundhigh
  1208.  dbra d0,.findhigh
  1209. .foundhigh
  1210.  asr.w #1,d0
  1211.  clr.l d3
  1212.  bset d0,d3
  1213.  move.l d3,d0
  1214.  
  1215.  move.w d0,d1
  1216.  muls d1,d1    ; x*x
  1217.  sub.l d2,d1    ; x*x-a
  1218.  asr.l #1,d1    ; (x*x-a)/2
  1219.  divs d0,d1    ; (x*x-a)/2x
  1220.  sub.w d1,d0    ; second approx
  1221.  bgt .stillnot0
  1222.  move.w #1,d0
  1223. .stillnot0
  1224.  
  1225.  move.w d0,d1
  1226.  muls d1,d1
  1227.  sub.l d2,d1
  1228.  asr.l #1,d1
  1229.  divs d0,d1
  1230.  sub.w d1,d0    ; second approx
  1231.  bgt .stillnot02
  1232.  move.w #1,d0
  1233. .stillnot02
  1234.  
  1235.  move.w d0,d1
  1236.  muls d1,d1
  1237.  sub.l d2,d1
  1238.  asr.l #1,d1
  1239.  divs d0,d1
  1240.  sub.w d1,d0    ; second approx
  1241.  bgt .stillnot03
  1242.  move.w #1,d0
  1243. .stillnot03
  1244.  
  1245.  
  1246. ; d0=perpdist
  1247.  
  1248.  cmp.w Range,d0
  1249.  sle GotThere
  1250.  bgt .faraway
  1251.  
  1252.  move.w oldx,newx
  1253.  move.w oldz,newz
  1254.  bra .nochange
  1255.  
  1256.  move.w xdiff,d1
  1257.  move.w zdiff,d2
  1258.  muls Range,d1
  1259.  muls Range,d2
  1260.  addq #3,d0
  1261.  divs d0,d1
  1262.  divs d0,d2
  1263.  subq #3,d0
  1264.  neg.w d1
  1265.  neg.w d2
  1266.  add.w d1,newx
  1267.  add.w d2,newz
  1268.  tst.b canshove
  1269.  beq .nochange
  1270.  move.w PLR1_opushx(pc),d1
  1271.  add.w PLR2_opushx(pc),d1
  1272.  sub.w d1,newx
  1273.  move.w PLR1_opushz(pc),d1
  1274.  add.w PLR2_opushz(pc),d1
  1275.  sub.w d1,newz
  1276.  move.w xdiff,d1
  1277.  move.w zdiff,d2
  1278.  move.w Range,d3
  1279.  sub.w d0,d3
  1280.  muls d3,d1
  1281.  muls d3,d2
  1282.  divs d0,d1
  1283.  divs d0,d2
  1284.  move.w d1,shovex
  1285.  move.w d2,shovez
  1286.  bra .nochange
  1287.  
  1288. .faraway:
  1289.  
  1290.  move.w speed,d3
  1291.  add.w Range,d3
  1292.  cmp.w d0,d3
  1293.  blt.s .notoofast
  1294.  move.w d0,d3
  1295.  st GotThere
  1296. .notoofast:
  1297.  sub.w Range,d3
  1298.  
  1299.  move.w xdiff,d1
  1300.  muls d3,d1
  1301.  divs d0,d1
  1302.  move.w zdiff,d2
  1303.  muls d3,d2
  1304.  divs d0,d2
  1305.  add.w oldx,d1
  1306.  move.w d1,newx
  1307.  add.w oldz,d2
  1308.  move.w d2,newz
  1309.  
  1310. .nochange:
  1311.  
  1312.  tst.w d0
  1313.  beq.s nocossin
  1314.  
  1315.  add.w #1,d0
  1316.  move.w xdiff,d1
  1317.  swap d1
  1318.  clr.w d1
  1319.  asr.l #1,d1
  1320.  divs d0,d1
  1321.  move.w d1,SinRet
  1322.  move.w zdiff,d1
  1323.  swap d1
  1324.  clr.w d1
  1325.  asr.l #1,d1
  1326.  divs d0,d1
  1327.  move.w d1,CosRet
  1328.  
  1329.  move.w SinRet,d0
  1330.  move.w #0,d2
  1331.  move.l #SineTable,a2
  1332.  lea 2048(a2),a3
  1333.  move.w #3,d5
  1334.  move.w #2048,d6
  1335. findanglop:
  1336.  
  1337.  move.w (a2,d2.w*2),d3
  1338.  move.w (a3,d2.w*2),d4
  1339.  muls d0,d4
  1340.  muls d1,d3
  1341.  sub.l d3,d4
  1342.  blt.s subang
  1343.  add.w d6,d2
  1344.  add.w d6,d2
  1345. subang:
  1346.  sub.w d6,d2
  1347.  and.w #4095,d2
  1348.  asr.w #1,d6
  1349.  dbra d5,findanglop
  1350.  add.w d2,d2
  1351.  move.w d2,AngRet
  1352.  
  1353. nocossin:
  1354.  
  1355.  rts
  1356.  
  1357. AngRet: dc.w 0
  1358. Range: dc.w 0
  1359. GotThere: dc.w 0
  1360. shovex: dc.w 0
  1361. shovez: dc.w 0
  1362. canshove: dc.w 0
  1363. PLR2_pushx: dc.l 0
  1364. PLR2_pushz: dc.l 0
  1365. PLR2_opushx: dc.l 0
  1366. PLR2_opushz: dc.l 0
  1367. PLR1_pushx: dc.l 0
  1368. PLR1_pushz: dc.l 0
  1369. PLR1_opushx: dc.l 0
  1370. PLR1_opushz: dc.l 0
  1371.  
  1372. CheckHit:
  1373.  move.w newx,d0
  1374.  sub.w oldx,d0
  1375.  move.w newz,d1
  1376.  sub.w oldz,d1
  1377.  muls d1,d1
  1378.  muls d0,d0
  1379.  add.l d0,d1
  1380.  cmp.l d2,d1
  1381.  slt hitwall
  1382.  rts
  1383.  
  1384. GetNextCPt:
  1385.  cmp.w d0,d1
  1386.  beq.s noneedforhassle
  1387.  muls #100,d0
  1388.  ext.l d1
  1389.  add.l d1,d0
  1390.  move.l a0,-(a7)
  1391.  lea ControlPts,a0
  1392.  move.b (a0,d0.w),d0
  1393.  ext.w d0
  1394.  move.l (a7)+,a0
  1395. noneedforhassle:
  1396.  rts
  1397.  
  1398. FromRoom: dc.l 0
  1399. ToRoom: dc.l 0
  1400. CanSee: dc.w 0
  1401. Facedir: dc.w 0
  1402.  
  1403.  even
  1404.  
  1405. CanItBeSeenAng:
  1406.  movem.l d0-d7/a0-a6,-(a7)
  1407.  
  1408.  move.w Facedir,d0
  1409.  move.l #SineTable,a0
  1410.  add.w d0,a0
  1411.  move.w (a0),d0
  1412.  move.w 2048(a0),d1
  1413.  move.w Targetx,d2
  1414.  sub.w Viewerx,d2
  1415.  move.w Targetz,d3
  1416.  sub.w Viewerz,d3
  1417.  muls d1,d2
  1418.  muls d0,d3
  1419.  sub.l d3,d2
  1420.  bgt.s ItMightBeSeen
  1421.  clr.b CanSee
  1422.  movem.l (a7)+,d0-a7/a0-a6
  1423.  rts
  1424. ItMightBeSeen:
  1425.  
  1426.  move.l ToRoom,a0
  1427.  move.w (a0),d0
  1428.  move.l FromRoom,a0
  1429.  adda.w #ToListOfGraph,a0
  1430.  bra.s InList
  1431.  
  1432. Viewerx: dc.l 0
  1433. Viewerz: dc.l 0
  1434. Targetx: dc.l 0
  1435. Targetz: dc.l 0
  1436. ViewerTop: dc.b 0
  1437. TargetTop: dc.b 0 
  1438. Viewery: dc.w 0
  1439. Targety: dc.w 0
  1440.  
  1441.   even
  1442.  
  1443. insameroom:
  1444.  st CanSee
  1445.  move.b ViewerTop,d0
  1446.  move.b TargetTop,d1
  1447.  eor.b d0,d1
  1448.  bne outlist
  1449.  movem.l (a7)+,d0-d7/a0-a6
  1450.  rts
  1451.  
  1452. CanItBeSeen:
  1453.  
  1454.  movem.l d0-d7/a0-a6,-(a7)
  1455.  move.l ToRoom,a1
  1456.  move.w (a1),d0
  1457.  move.l FromRoom,a0
  1458.  cmp.l a0,a1
  1459.  beq.s insameroom
  1460.  
  1461.  adda.w #ToListOfGraph,a0
  1462.  
  1463. InList:
  1464.  move.w (a0),d1
  1465.  tst.w d1
  1466.  blt outlist
  1467.  move.l ZoneGraphAdds,a1
  1468.  move.l (a1,d1.w*8),a1
  1469.  add.l LEVELGRAPHICS,a1
  1470.  
  1471.  adda.w #8,a0
  1472.  cmp.w (a1),d0
  1473.  beq isinlist
  1474.  
  1475.  bra.s InList
  1476.  
  1477. isinlist:
  1478. ; We have found the dest room in the
  1479. ; list of rooms visible from the
  1480. ; source room.
  1481.  
  1482. ; Do line of sight!
  1483.  
  1484.  st CanSee
  1485.  
  1486.  move.l Points,a2
  1487.  move.w Targetx,d1
  1488.  move.w Targetz,d2
  1489.  sub.w Viewerx,d1
  1490.  sub.w Viewerz,d2
  1491.  
  1492.  moveq #0,d3
  1493.  move.w -6(a0),d3
  1494.  blt nomorerclips
  1495.  move.l LEVELCLIPS,a1
  1496.  lea (a1,d3.l*2),a1
  1497.  move.l a1,clipstocheck
  1498. checklcliploop:
  1499.  tst.w (a1)
  1500.  blt nomorelclips
  1501.  
  1502.  move.w (a1),d0
  1503.  blt.s noleftone
  1504.  move.l (a2,d0.w*4),d3
  1505.  move.w d3,d4
  1506.  sub.w Viewerz,d4
  1507.  swap d3
  1508.  sub.w Viewerx,d3
  1509.  muls d2,d3
  1510.  muls d1,d4
  1511.  sub.l d3,d4
  1512.  ble outlist
  1513.  
  1514. noleftone:
  1515.  
  1516.  addq #2,a1
  1517.  
  1518.  bra checklcliploop
  1519.  
  1520. nomorelclips:
  1521.  
  1522.  addq #2,a1
  1523.  
  1524. checkrcliploop:
  1525.  tst.w (a1)
  1526.  blt nomorerclips
  1527.  
  1528.  move.w (a1),d0
  1529.  blt.s norightone
  1530.  move.l (a2,d0.w*4),d3
  1531.  move.w d3,d4
  1532.  sub.w Viewerz,d4
  1533.  swap d3
  1534.  sub.w Viewerx,d3
  1535.  muls d2,d3
  1536.  muls d1,d4
  1537.  sub.l d3,d4
  1538.  bge outlist
  1539.  
  1540. norightone:
  1541.  addq #2,a1
  1542.  
  1543.  bra checkrcliploop
  1544.  
  1545.  
  1546. nomorerclips:
  1547.  
  1548. ; No clipping points in the way; got to do the
  1549. ; vertical working out now.
  1550.  
  1551.  move.w Targetx,d0
  1552.  move.w Targetz,d1
  1553.  sub.w Viewerx,d0
  1554.  sub.w Viewerz,d1
  1555.  move.l FromRoom,a5
  1556.  move.l FloorLines,a1
  1557.  move.b ViewerTop,d2
  1558.  move.w Targety,d7
  1559.  sub.w Viewery,d7
  1560.  
  1561.  
  1562. GoThroughZones:
  1563.  move.l a5,a0
  1564.  adda.w ToExitList(a0),a0
  1565.  
  1566. FindWayOut:
  1567.  move.w (a0)+,d5
  1568.  blt outlist
  1569.  asl.w #4,d5
  1570.  lea (a1,d5.w),a2
  1571.  
  1572.  move.w (a2),d3
  1573.  move.w 2(a2),d4
  1574.  sub.w Viewerx,d3
  1575.  sub.w Viewerz,d4
  1576.  move.w d3,d5
  1577.  move.w d4,d6
  1578.  muls d1,d3
  1579.  muls d0,d4
  1580.  sub.l d3,d4
  1581.  ble FindWayOut
  1582.  
  1583.  add.w 4(a2),d5
  1584.  add.w 6(a2),d6
  1585.  muls d0,d6
  1586.  muls d1,d5
  1587.  sub.l d5,d6
  1588.  bge FindWayOut
  1589.  
  1590.  tst.w 8(a2)
  1591.  blt outlist
  1592.  
  1593. ; Here is the exit from the room. Calculate the height at which
  1594. ; we meet it.
  1595.  
  1596.  move.w Targetx,d3
  1597.  move.w Targetz,d4
  1598.  sub.w (a2),d3
  1599.  sub.w 2(a2),d4
  1600.  muls 4(a2),d4
  1601.  muls 6(a2),d3
  1602.  sub.l d3,d4    ; positive
  1603.  
  1604.  move.w Viewerx,d5
  1605.  move.w Viewerz,d6
  1606.  sub.w (a2),d5
  1607.  sub.w 2(a2),d6
  1608.  muls 4(a2),d6
  1609.  muls 6(a2),d5
  1610.  sub.l d6,d5    ; positive
  1611.  
  1612.  divs 10(a2),d4
  1613.  divs 10(a2),d5
  1614.  
  1615.  add.w d5,d4
  1616.  beq.s sameheight
  1617.  muls d7,d5
  1618.  divs d4,d5
  1619. sameheight:
  1620.  add.w Viewery,d5    ; height at which we cross wall
  1621.  
  1622.  ext.l d5
  1623.  asl.l #7,d5
  1624.  
  1625.  tst.b d2
  1626.  beq.s comparewithbottom
  1627.  
  1628.  cmp.l ToUpperRoof(a5),d5
  1629.  blt outlist
  1630.  cmp.l ToUpperFloor(a5),d5
  1631.  bgt outlist
  1632.  bra.s madeit
  1633.  
  1634. comparewithbottom:
  1635.  cmp.l ToZoneRoof(a5),d5
  1636.  blt outlist
  1637.  cmp.l ToZoneFloor(a5),d5
  1638.  bgt outlist
  1639. madeit:
  1640.  st donessomething
  1641.  
  1642.  moveq #0,d3
  1643.  move.w 8(a2),d3
  1644.  move.l ZoneAdds,a3
  1645.  move.l (a3,d3.w*4),a5
  1646.  add.l LEVELDATA,a5
  1647.  
  1648.  clr.b d2
  1649.  cmp.l ToZoneFloor(a5),d5
  1650.  bgt outlist
  1651.  cmp.l ToZoneRoof(a5),d5
  1652.  bgt.s GotIn
  1653.  st d2
  1654.  cmp.l ToUpperFloor(a5),d5
  1655.  bgt outlist
  1656.  cmp.l ToUpperRoof(a5),d5
  1657.  blt outlist
  1658.  
  1659. GotIn:
  1660.  
  1661.  cmp.l ToRoom,a5
  1662.  bne GoThroughZones
  1663.  
  1664.  move.b TargetTop,d3
  1665.  eor.b d2,d3
  1666.  bne outlist
  1667.  
  1668.  movem.l (a7)+,d0-d7/a0-a6
  1669.  rts
  1670.  
  1671. clipstocheck: dc.l 0
  1672. donessomething: dc.w 0
  1673.  
  1674. outlist:
  1675.  clr.b CanSee
  1676.  movem.l (a7)+,d0-d7/a0-a6
  1677.  rts
  1678.  
  1679.  
  1680. FindCollisionPt:
  1681.  movem.l d0-a7/a0-a6,-(a7)
  1682.  
  1683.  move.w Targetx,d0
  1684.  move.w Targetz,d1
  1685.  sub.w Viewerx,d0
  1686.  sub.w Viewerz,d1
  1687.  move.l FromRoom,a5
  1688.  move.l FloorLines,a1
  1689.  move.b ViewerTop,d2
  1690.  move.w Targety,d7
  1691.  sub.w Viewery,d7
  1692.  
  1693.  
  1694. .GoThroughZones:
  1695.  move.l a5,a0
  1696.  adda.w ToExitList(a0),a0
  1697.  
  1698. .FindWayOut:
  1699.  move.w (a0)+,d5
  1700.  blt outlist
  1701.  asl.w #4,d5
  1702.  lea (a1,d5.w),a2
  1703.  
  1704.  move.w (a2),d3
  1705.  move.w 2(a2),d4
  1706.  sub.w Viewerx,d3
  1707.  sub.w Viewerz,d4
  1708.  move.w d3,d5
  1709.  move.w d4,d6
  1710.  muls d1,d3
  1711.  muls d0,d4
  1712.  sub.l d3,d4
  1713.  ble .FindWayOut
  1714.  
  1715.  add.w 4(a2),d5
  1716.  add.w 6(a2),d6
  1717.  muls d0,d6
  1718.  muls d1,d5
  1719.  sub.l d5,d6
  1720.  bge .FindWayOut
  1721.  
  1722.  
  1723. ; Here is the exit from the room. Calculate the height at which
  1724. ; we meet it.
  1725.  
  1726.  move.w Targetx,d3
  1727.  move.w Targetz,d4
  1728.  sub.w (a2),d3
  1729.  sub.w 2(a2),d4
  1730.  muls 4(a2),d4
  1731.  muls 6(a2),d3
  1732.  sub.l d3,d4    ; positive
  1733.  
  1734.  move.w Viewerx,d5
  1735.  move.w Viewerz,d6
  1736.  sub.w (a2),d5
  1737.  sub.w 2(a2),d6
  1738.  muls 4(a2),d6
  1739.  muls 6(a2),d5
  1740.  sub.l d6,d5    ; positive
  1741.  
  1742.  divs 10(a2),d4
  1743.  divs 10(a2),d5
  1744.  
  1745.  move.w d5,d6
  1746.  add.w d5,d4
  1747.  beq.s .sameheight
  1748.  muls d7,d5
  1749.  divs d4,d5
  1750. .sameheight:
  1751.  add.w Viewery,d5    ; height at which we cross wall
  1752.  
  1753.  ext.l d5
  1754.  asl.l #7,d5
  1755.  
  1756.  moveq #0,d3
  1757.  move.w 8(a2),d3
  1758.  blt foundpt
  1759.  move.l ZoneAdds,a3
  1760.  move.l (a3,d3.w*4),a5
  1761.  add.l LEVELDATA,a5
  1762.  
  1763.  clr.b d2
  1764.  cmp.l ToZoneFloor(a5),d5
  1765.  bgt foundpt
  1766.  cmp.l ToZoneRoof(a5),d5
  1767.  bgt.s .GotIn
  1768.  st d2
  1769.  cmp.l ToUpperFloor(a5),d5
  1770.  bgt foundpt
  1771.  cmp.l ToUpperRoof(a5),d5
  1772.  blt foundpt
  1773.  
  1774. .GotIn:
  1775.  
  1776.  bra .GoThroughZones
  1777.  
  1778.  tst.w d4
  1779.  beq.s foundpt
  1780.  muls d6,d0
  1781.  divs d4,d0
  1782.  muls d6,d1
  1783.  divs d4,d1
  1784.  add.w Viewerx,d0
  1785.  add.w Viewerz,d1
  1786.  move.w d0,Targetx
  1787.  move.w d1,Targetz
  1788.  move.l d5,Targety
  1789.  
  1790. foundpt:
  1791.  
  1792.  movem.l (a7)+,d0-a7/a0-a6
  1793.  rts
  1794.  
  1795. GetRand:
  1796.  move.w Rand1,d0
  1797.  add.w #29,d0
  1798.  eor.w #$5f37,d0
  1799.  neg.w d0
  1800.  rol.w #5,d0
  1801.  move.w d0,Rand1
  1802.  rts
  1803.  
  1804. Rand1: dc.w 234
  1805.  
  1806. GoInDirection:
  1807.  move.l #SineTable,a0
  1808.  lea (a0,d0.w),a0
  1809.  move.w (a0),d1
  1810.  move.w 2048(a0),d2
  1811.  muls speed,d1
  1812.  add.l d1,d1
  1813.  muls speed,d2
  1814.  add.l d2,d2
  1815.  swap d1
  1816.  swap d2
  1817.  add.w oldx,d1
  1818.  add.w oldz,d2
  1819.  move.w d1,newx
  1820.  move.w d2,newz
  1821.  rts
  1822.  
  1823. CollideFlags: dc.l 0
  1824.  
  1825. Collision:
  1826.  
  1827.  move.l ObjectData,a0
  1828.  move.w CollId,d0
  1829.  asl.w #6,d0
  1830.  move.b 16(a0,d0.w),d0
  1831.  ext.w d0
  1832.  
  1833.  sub.w #64,a0
  1834.  move.l ObjectPoints,a1
  1835.  move.l #ColBoxTable,a2
  1836.  lea  (a2,d0.w*8),a3
  1837.  
  1838.  move.l CollideFlags,d7
  1839.  move.b StoodInTop,d6
  1840.  move.l newy,d4
  1841.  move.l d4,d5
  1842.  add.l thingheight,d5
  1843.  asr.l #7,d4
  1844.  asr.l #7,d5
  1845.  clr.b hitwall
  1846.  
  1847. checkcol:
  1848.  add.w #64,a0
  1849.  
  1850.  move.w (a0),d0
  1851.  blt checkedallcol
  1852.  
  1853.  cmp.w CollId,d0
  1854.  beq.s checkcol
  1855.  
  1856.  tst.w 12(a0)
  1857.  blt.s checkcol
  1858.  
  1859.  tst.b numlives(a0)
  1860.  beq.s checkcol
  1861.  
  1862.  move.b ObjInTop(a0),d1
  1863.  eor.b d6,d1
  1864.  bne checkcol
  1865.  
  1866.  moveq #0,d3
  1867.  move.b 16(a0),d3
  1868.  blt checkcol
  1869.  
  1870.  btst d3,d7
  1871.  beq checkcol
  1872.  
  1873.  move.w 4(a0),d1
  1874.  sub.w 2(a2,d3.w*8),d1
  1875.  cmp.w d1,d5
  1876.  blt checkcol
  1877.  add.w 4(a2,d3.w*8),d1
  1878.  cmp.w d1,d4
  1879.  bgt checkcol
  1880.  
  1881.  move.w (a1,d0.w*8),d1
  1882.  move.w 4(a1,d0.w*8),d2
  1883.  sub.w newx,d1
  1884.  bge.s .xnoneg
  1885.  neg.w d1
  1886. .xnoneg:
  1887.  sub.w newz,d2
  1888.  bge.s .znoneg
  1889.  neg.w d2
  1890. .znoneg:
  1891.  cmp.w d1,d2
  1892.  ble.s .checkx
  1893.  sub.w (a3),d2
  1894.  cmp.w (a2,d3.w*8),d2
  1895.  bgt checkcol
  1896.  st hitwall
  1897.  bra checkedallcol
  1898. .checkx:
  1899.  sub.w (a3),d1
  1900.  cmp.w (a2,d3.w*8),d1
  1901.  bgt checkcol
  1902.  
  1903.  move.w (a1,d0.w*8),d1
  1904.  move.w 4(a1,d0.w*8),d2
  1905.  move.w d1,d6
  1906.  move.w d2,d7
  1907.  sub.w newx,d6
  1908.  sub.w newz,d7
  1909.  muls d6,d6
  1910.  muls d7,d7
  1911.  add.l d6,d7
  1912.  sub.w oldx,d1
  1913.  sub.w oldz,d2
  1914.  muls d1,d1
  1915.  muls d2,d2
  1916.  add.l d1,d2
  1917.  cmp.l d2,d7
  1918.  bgt checkcol
  1919.  
  1920.  st hitwall
  1921.  bra checkedallcol
  1922.  
  1923. ; bra checkcol
  1924.  
  1925. checkedallcol:
  1926.  rts
  1927.  
  1928. ColBoxTable:
  1929.  
  1930. ; red scurrying alien
  1931.  dc.w 40,60,120,0
  1932. ; Medipack
  1933.  dc.w 40,20,40,0
  1934. ; Bullet
  1935.  dc.w 40,20,40,0
  1936. ; Gun
  1937.  dc.w 40,20,40,0
  1938. ; Key
  1939.  dc.w 40,20,40,0
  1940. ; PLayer1
  1941.  dc.w 40,40,80,0
  1942. ;Robot
  1943.  dc.w 40,50,100,0
  1944. ;?
  1945.  dc.w 40,20,40,0
  1946. ; Flying Nasty
  1947.  dc.w 80,60,120,0
  1948. ; Ammo
  1949.  dc.w 40,20,40,0
  1950. ; Barrel
  1951.  dc.w 40,30,60,0
  1952. ;PlAYER2
  1953.  dc.w 40,40,80,0
  1954. ; Mutant Marine
  1955.  dc.w 40,40,80,0
  1956. ; worm
  1957.  dc.w 80,60,120,0
  1958. ; huge red thing
  1959.  dc.w 160,100,200,0
  1960. ; small red thing
  1961.  dc.w 80,50,100,0
  1962. ; tree
  1963.  dc.w 80,60,120,0
  1964. ; eyeball
  1965.  dc.w 40,30,60,0
  1966. ; Tough Marine
  1967.  dc.w 40,40,80,0
  1968. ; ShotGun Marine
  1969.  dc.w 40,40,80,0
  1970.  
  1971. FromZone: dc.w 0
  1972. OKTEL: dc.w 0
  1973. floortemp: dc.l 0
  1974.  
  1975. CheckTeleport:
  1976.  clr.b OKTEL
  1977.  move.w FromZone,d0
  1978.  move.l ZoneAdds,a2
  1979.  move.l (a2,d0.w*4),a2
  1980.  add.l LEVELDATA,a2
  1981.  tst.w ToTelZone(a2)
  1982.  bge.s ITSATEL
  1983.  rts
  1984.  
  1985. ITSATEL:
  1986.  move.l ToZoneFloor(a2),floortemp
  1987.  move.w ToTelZone(a2),d0
  1988.  move.l ZoneAdds,a3
  1989.  move.l (a3,d0.w*4),a3
  1990.  add.l LEVELDATA,a3
  1991.  move.l ToZoneFloor(a3),d0
  1992.  sub.l floortemp,d0
  1993.  move.l d0,floortemp
  1994.  add.l d0,newy 
  1995.  move.w ToTelX(a2),newx
  1996.  move.w ToTelZ(a2),newz
  1997.  move.l #%1111111111111111111,CollideFlags
  1998.  movem.l a0/a1/a2,-(a7)
  1999.  bsr Collision
  2000.  movem.l (a7)+,a0/a1/a2
  2001.  
  2002.  move.l floortemp,d0
  2003.  sub.l d0,newy
  2004.  
  2005.  tst.b hitwall
  2006.  seq OKTEL
  2007.  beq.s .teleport
  2008.  rts
  2009. .teleport:
  2010.  move.w ToTelZone(a2),d0
  2011.  move.l ZoneAdds,a2
  2012.  move.l (a2,d0.w*4),a2
  2013.  add.l LEVELDATA,a2
  2014.  move.l a2,objroom
  2015.  
  2016.  rts
  2017.  
  2018. FindCloseRoom:
  2019.  ; d0 is distance.
  2020.  
  2021.  move.w 4(a0),d1
  2022.  ext.l d1
  2023.  asl.l #7,d1
  2024.  move.l d1,oldy
  2025.  move.l d1,newy
  2026.  
  2027.  move.w (a0),d1
  2028.  move.l ObjectPoints,a1
  2029.  lea (a1,d1.w*8),a1
  2030.  move.w (a1),oldx 
  2031.  move.w 4(a1),oldz
  2032.  
  2033.  move.w 12(a0),d2
  2034.  move.l ZoneAdds,a5
  2035.  move.l (a5,d2.w*4),d2
  2036.  add.l LEVELDATA,d2
  2037.  move.l d2,objroom
  2038.  
  2039.  move.w THISPLRxoff,newx
  2040.  move.w THISPLRzoff,newz
  2041.  move.w d0,speed
  2042.  movem.l a0/a1,-(a7)
  2043.  jsr HeadTowards
  2044.  movem.l (a7)+,a0/a1
  2045.  
  2046.  move.w newx,d0
  2047.  sub.w oldx,d0
  2048.  move.w oldz,d1
  2049.  sub.w newz,d1
  2050.  
  2051.  move.w d1,xd
  2052.  move.w d0,zd
  2053.  
  2054.  move.l #100000,StepUpVal
  2055.  move.l #100000,StepDownVal
  2056.  move.w #0,thingheight
  2057.  
  2058.  st exitfirst
  2059.  
  2060.  add.w oldx,d1
  2061.  add.w oldz,d0
  2062.  move.w d1,newx
  2063.  move.w d0,newz
  2064.  movem.l d0-d7/a0-a6,-(a7)
  2065.  clr.b wallbounce
  2066.  jsr MoveObject
  2067.  movem.l (a7)+,d0-d7/a0-a6
  2068.  
  2069.  move.l #RoomPath,a2
  2070.  move.l #possclose,a3
  2071.  move.w 12(a0),(a3)+
  2072.  
  2073. putinmore:
  2074.  move.w (a2)+,(a3)+
  2075.  bge.s putinmore
  2076.  subq #2,a3
  2077.  
  2078.  move.w oldx,d0
  2079.  sub.w xd,d0
  2080.  move.w oldz,d1
  2081.  sub.w zd,d1
  2082.  move.w d0,newx
  2083.  move.w d1,newz    
  2084.  
  2085.  movem.l d0-d7/a0-a6,-(a7)
  2086.  clr.b wallbounce
  2087.  jsr MoveObject
  2088.  movem.l (a7)+,d0-d7/a0-a6
  2089.  
  2090.  move.l #RoomPath,a2
  2091.  
  2092. putinmore2:
  2093.  move.w (a2)+,d0
  2094.  move.w d0,(a3)+
  2095.  tst.w d0
  2096.  bge.s putinmore2
  2097.  
  2098. ; ok a3 points at list of rooms passed through.
  2099.  move.w #-1,(a3)+
  2100.  
  2101.  
  2102.  move.w 12(a0),d7
  2103.  
  2104.  move.l endoflist,a3
  2105. FINDCLOSELOOP:
  2106.  move.l #possclose,a2
  2107.  move.w -(a3),d0
  2108.  blt foundclose
  2109.  
  2110. findinner
  2111.  move.w (a2)+,d1
  2112.  blt.s outin
  2113.  cmp.w d0,d1
  2114.  bne.s findinner
  2115.  move.w d0,d7
  2116. outin:
  2117.  
  2118.  bra.s FINDCLOSELOOP
  2119.  
  2120. foundclose:
  2121.  
  2122.  move.w d7,GraphicRoom(a0)
  2123.  
  2124.  rts
  2125.  
  2126. xd: dc.w 0
  2127. zd: dc.w 0
  2128.  
  2129. possclose:
  2130.  ds.w 100